package com.server.rpcserver;


import com.server.ioc.RpcIOC;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Zixiang Hu
 * @description
 * @create 2021-02-25-16:01
 */
public class ServiceProvider {
    /**
     * 一个实现类可能实现多个接口,键是接口的全限定名，值是该接口的实现类
     */
    private Map<String, Object> interfaceProvider;

    private RpcIOC rpcIOC;

    /**
     * 传入待扫描的包，使用ioc容器时推荐使用，配合自定义的RpcBean注解
     * @param packName
     */
    public ServiceProvider(String packName) {
        this.interfaceProvider = new HashMap<>();
        this.rpcIOC = new RpcIOC(packName);
    }

    public ServiceProvider() {
        this.interfaceProvider = new HashMap<>();
        this.rpcIOC = new RpcIOC("com.server.service");
    }

    /**
     * serviceProvider.putService(new UserServiceImpl());
     * serviceProvider.putService(new DeptServiceImpl());
     *
     * @param service 用spring的ioc容器代替或者用自定义的ioc容器代替；这里改用自己的ioc代替
     */
    @Deprecated
    public void putService(Object service) {
        // 获得该类的所有接口
        Class<?>[] interfaces = service.getClass().getInterfaces();
        // 键是接口的全限定名，值是该接口的实现类
        for (Class clazz : interfaces) {
            interfaceProvider.put(clazz.getName(), service);
        }

    }

    /**
     * 根据服务名获取服务实例
     * @param interfaceName
     * @return
     * @throws ClassNotFoundException
     */
    public Object getService(String interfaceName) throws ClassNotFoundException {
//        return interfaceProvider.get(interfaceName);
        return rpcIOC.getBean(Class.forName(interfaceName));
    }
}
